package cn.ecut.dzy.prodConsumer;

/**
 * @program: java-interview
 * @description:一个初始值为0的变量，两个线程对其交替操作，一个加1，一个减1，来5轮
 * @author: DingZhenYun
 * @create: 2021-10-25 10:47
 * <p>
 * <p>
 *
 *
 *     sync
 * wait       notify
 */
/**
 * 线程 操作 资源类
 * 判断 干活 通知
 * 防止虚假唤醒机制
 */

/**
 * 资源类
 */
class ShareData1 {
    private int number = 0;
    Object obj1 = new Object();

    public synchronized void increment() throws InterruptedException {
        while (number != 0) {
            wait();
        }
        // 干活
        number++;
        System.out.println(Thread.currentThread().getName() + "\t " + number);
        // 通知 唤醒
        notifyAll();
    }

    public synchronized void decrement() throws Exception {
        // 判断
        while (number == 0) {
            // 等待不能消费
            wait();
        }

        // 干活
        number--;
        System.out.println(Thread.currentThread().getName() + "\t " + number);
        // 通知 唤醒
        notifyAll();
    }


}

public class ProdConsumerTraditionThreadDemo {
    public static void main(String[] args) {

        // 高内聚，低耦合    内聚指的是，一个空调，自身带有调节温度高低的方法
        ShareData1 shareData = new ShareData1();
        // t1线程，生产
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                try {
                    shareData.increment();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, "t1").start();

        // t2线程，消费
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                try {
                    shareData.decrement();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, "t2").start();
    }
}
